package rescuecore2.worldmodel;

import org.json.JSONObject;
import java.util.Set;

import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;

/**
 * Interface for all objects that live in a WorldModel. Entities are made up of
 * a fixed set of properties. The values of those properties may change but the
 * set of properties may not.
 */
public interface Entity {

  /**
   * Add an EntityListener.
   *
   * @param l
   *          The listener to add.
   */
  void addEntityListener( EntityListener l );

  /**
   * Remove an EntityListener.
   *
   * @param l
   *          The listener to remove.
   */
  void removeEntityListener( EntityListener l );

  /**
   * Get the ID of this Entity.
   *
   * @return The ID.
   */
  EntityID getID();

  /**
   * Get the urn of this Entity.
   *
   * @return The type.
   */
  String getURN();

  /**
   * Get all the properties that this entity has.
   *
   * @return A set of Properties. This will never be null, but may be empty.
   */
  Set<Property> getProperties();

  /**
   * Get a property by urn.
   *
   * @param urn
   *          The urn to look up.
   * @return The property with the given urn or null if no such property exists.
   */
  Property getProperty( String urn );

  /**
   * Write this Entity to a stream.
   *
   * @param out
   *          The stream to write to.
   * @throws IOException
   *           If the write fails.
   */
  void write( OutputStream out ) throws IOException;

  /**
   * Read this Entity from a stream.
   *
   * @param in
   *          The stream to read from.
   * @throws IOException
   *           If the read fails.
   */
  void read( InputStream in ) throws IOException;

  /**
   * Create a copy of this entity.
   *
   * @return A new Entity with the same ID and property values.
   */
  Entity copy();

  /**
   * Return the Entity state in JSON format
   *
   * @return Entity states
   */
  JSONObject toJson();
}
